// Libreria.cpp : Defines the entry point for the console application.
/*
Questa libreria C contiene le funzioni che permettono di: 
1) La ricerca lineare in un array;
2) L'inversione di un array;
3) L'ordinamento di un array per selezione e per bubble sort;
4) L'inserimento di un valore nella riga e uno che va nella colonna, uno nella diagonale principale e uno in quella secondaria, di una matrice;
5) La ricerca di un elemento;
6) Traspostare la matrice;
7) Dati due elementi, calcolare la distanza;
8) Ridurre la matrice;
*/

void ricerca_array(int array[])
{
	int x;
	bool trovato = false;
	for (int j = 0; j < LEN; j++)
	{
		if (array[j] == x)
		{
			trovato = true;
			break;
		}
	}
}

void inverti_array(int array[])
{
	int temp;
	for (int j = 0; j < (LEN-1)/2; j++)
	{
		temp = array[j];
		array[j] = array[LEN - 1 - j];
		array[LEN - 1 - j] = temp;
	}
}

void ordina_bs(int array[])
{
	int buff;
	for (int j = 0; j < LEN - 1; j++)
	{
		for (int k = 0; k < LEN - 1 - j; k++)
		{
			if (array[k] > array[k + 1])
			{
				buff = array[k];
				array[k] = array[k + 1];
				array[k + 1] = buff;
			}
		}
	}
}

void ordina_selezione(int array[])
{
	int buff;
	for (int j = 0; j < LEN - 1; j++)
	{
		for (int i = j + 1; i < LEN; i++)
		{
			if (array[i] < array[j])
			{
				buff = array[i];
				array[i] = array[j];
				array[j] = buff;
			}
		}
	}
}

void inserisci_mriga(int m[][NC])
{
	int riga;
	do
	{
		printf("Inserisci la riga:\n");
		cin >> riga;
	} while ((riga < 0) || (riga > NR));
	for (int j = 0; j < NR; j++)
	{
		for (int i = 0; i < NC; i++)
		{
			if (j == riga)
			{
				m[j][i] = 1 + rand() % 30;
			}
		}
	}
}

void inserisci_mcolonna(int m[][NC])
{
	int colonna;
	do
	{
		printf("Inserisci la colonna:\n");
		cin >> colonna;
	} while ((colonna < 0) || (colonna > NC));
	for (int j = 0; j < NR; j++)
	{
		for (int i = 0; i < NC; i++)
		{
			if (i == colonna)
			{
				m[j][i] = 1 + rand() % 30;
			}
		}
	}
}

void inserisci_diagonalepr(int m[][NC])
{
	for (int j = 0; j < NR; j++)
	{
		for (int i = 0; i < NC; i++)
		{
			if (j==i)
			{
				m[j][i] = 1 + rand() % 30;
			}
		}
	}
}

void inserisci_diagonalesec(int m[][NC])
{
	for (int j = 0; j < NR; j++)
	{
		for (int i = 0; i < NC; i++)
		{
			if ((j+i)==(NR-1))
			{
				m[j][i] = 1 + rand() % 30;
			}
		}
	}
}

void ricerca_matrice(int m[][NC])
{
	bool trovato = false;
	int riga = 0;
	int colonna = 0;
	int x;
	printf("Inserisci il numero da cercare: \n");
	cin >> x;
	for (int j = 0; j < NR && trovato==false; j++)
	{
		for (int i = 0; i < NC && trovato == false; i++)
		{
			if (m[j][i] == x)
			{
				trovato = true;
				riga = j;
				colonna = i;
			}
		}
	}
	if (trovato == true)
	{
		printf("La prima occorrenza dell'elemento %d è nella cella %d %d\n", x, riga, colonna);
	}
	else
	{
		printf("L'elemento %d non è presente nella matrice\n", x);
	}
}

void trasposta(int matrice[][NC])
{
	int temp;
	for (int j = 0; j < NR; j++)
	{
		for (int i = j; i < NC; i++)
		{
			temp = m[j][i];
			m[j][i] = m[i][j];
			m[i][j] = temp;
		}
	}
}

void calcola_distanza(int x1, int x2, int y1, int y2)
{
	double distanza;
	distanza = sqrt((double)(((x2*x2) - (x1*x1)) + ((y2*y2) - (y1*y1))));
	printf("La distanza è: %lf\n", distanza);
}

void riduci(double m1[][NC], int riga, int colonna)
{
	double m2[NR-1][NC-1];
	int r = 0;
	int c = 0;
	for (int j = 0; j < NR; j++)
	{
		if (j == riga)
		{
			continue;
		}
		for (int i = 0; i < NC; i++)
		{
			if (i == colonna)
			{
				continue;
			}
			m2[r][c] = m[j][i];
			c++;
			if (c == 2)
			{
				r++;
				c = 0;
			}
		}
	}
}